package minijvm.method;

import minijvm.attr.CodeAttr;
import minijvm.clz.ClassFile;
import minijvm.cmd.ByteCodeCommand;
import minijvm.constant.ConstantPool;
import minijvm.constant.UTF8Info;
import minijvm.loader.ByteCodeIterator;

public class Method {
    
    private int accessFlag;
    private int nameIndex;
    private int descriptorIndex;
    
    private CodeAttr codeAttr;
    
    private ClassFile clzFile;
    
    
    public ClassFile getClzFile() {
        return clzFile;
    }

    public int getNameIndex() {
        return nameIndex;
    }
    public int getDescriptorIndex() {
        return descriptorIndex;
    }
    
    public CodeAttr getCodeAttr() {
        return codeAttr;
    }

    public void setCodeAttr(CodeAttr code) {
        this.codeAttr = code;
    }
    
    

    public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) {
        this.clzFile = clzFile;
        this.accessFlag = accessFlag;
        this.nameIndex = nameIndex;
        this.descriptorIndex = descriptorIndex;
    }

    
    
    
    
    @Override
    public String toString() {
        
        ConstantPool pool = this.clzFile.getConstantPool();
        StringBuilder buffer = new StringBuilder();
        
        String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue();
        
        String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue();
        
        buffer.append(name).append(":").append(desc).append("\n");
        
        buffer.append(this.codeAttr.toString(pool));
        
        return buffer.toString();
    }
    
    public static Method parse(ClassFile clzFile, ByteCodeIterator iter){
        return null;
        
    }

    public ByteCodeCommand[] getCmds() {        
        return this.getCodeAttr().getCmds();
    }
}
